﻿using System;
using System.Web.Mvc;

namespace LAPI.Web.Controllers.Deporte
{
    /// <summary>
    /// Controlador para /Deporte/
    /// </summary>
    public class DeporteController : BaseController
    {

        #region /Deporte/Gestion
        /// <summary>
        /// GET: /Deporte/Gestion
        /// </summary>
        /// <returns>View Gestion.cshtml</returns>
        [HttpGet]
        public ActionResult Gestion()
        {
            ActionResult resultado = comprobarErrorPermisoAdminSistema();
            if (resultado == null)
            {
                LAPI.Business.Gestores.GestorDeportes gestor = new Business.Gestores.GestorDeportes();

                return View(gestor.ObtenerTodos());
            }

            return resultado;
        }
        #endregion

        #region /Deporte/Editar

        /// <summary>
        /// GET: /Deporte/Editar
        /// </summary>
        /// <param name="id">Identificador único del deporte</param>
        /// <returns>View Editar.cshtml</returns>
        [HttpGet]
        public ActionResult Editar(Int32 id)
        {
            ActionResult resultado = comprobarErrorPermisoAdminSistema();
            if (resultado == null && id != 0)
            {
                LAPI.Business.Gestores.GestorDeportes gestor = new Business.Gestores.GestorDeportes();
                return View(gestor.ObtenerPorID(IdDeporte: id));
            }

            return resultado;
        }

        /// <summary>
        /// POST: /Deporte/Editar
        /// </summary>
        /// <param name="model">modelo de Deporte</param>
        /// <returns>String con el resultado JSON de la operacion</returns>
        [HttpPost]
        public String Editar(LAPI.Data.Model.Deporte model)
        {
            LAPI.Business.Acciones.ResultadoAccion resultado = null;

            //0. Comprobamos que haya sesión
            resultado = comprobarPermisoAdminSistema();
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //1. Validamos que podamos realizar el cambio            
            LAPI.Business.Acciones.AccValidarDatosEditarDeporte validacion = new Business.Acciones.AccValidarDatosEditarDeporte();
            resultado = validacion.ValidarDatosEditarDeporte(datosDeporte: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //2. Modificamos los datos
            LAPI.Business.Acciones.AccEditarDeporte modificar = new Business.Acciones.AccEditarDeporte();
            resultado = modificar.EditarDeporte(datosDeporte: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }          

            //3. Todo ha ido bien, redirigimos a la vista de gestion
            resultado = new Business.Acciones.ResultadoAccion();
            resultado.setResultado(Business.Acciones.TipoResultado.REDIRECCION);
            resultado.addMensaje(
                mensaje: Url.Action(actionName: "Gestion", controllerName: "Deporte"),
                tipoMensaje: Business.Acciones.TipoMensaje.REDIRECCION
            );

            return resultado.ResultadoToJson();
        }
        #endregion

        #region /Deporte/Crear

        /// <summary>
        /// GET: /Deporte/Crear
        /// </summary>
        /// <returns>View Crear.cshtml</returns>
        [HttpGet]
        public ActionResult Crear()
        {
            ActionResult resultado = comprobarErrorPermisoAdminSistema();
            if (resultado == null)                 
            {
                    return View();
            }

            return resultado;
        }

        /// <summary>
        /// POST: /Deporte/Crear
        /// </summary>
        /// <param name="model">modelo de Deporte</param>
        /// <returns>String con el resultado JSON de la operacion</returns>
        [HttpPost]
        public String Crear(LAPI.Data.Model.Deporte model)
        {
            LAPI.Business.Acciones.ResultadoAccion resultado = null;

            //0. Comprobamos que haya sesión
            resultado = comprobarPermisoAdminSistema();
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //1. Validamos que podamos crear
            LAPI.Business.Acciones.AccValidarDatosCrearDeporte validacion = new Business.Acciones.AccValidarDatosCrearDeporte();
            resultado = validacion.ValidarDatosCrearDeporte(datosDeporte: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //2. Creamos
            LAPI.Business.Acciones.AccCrearDeporte crear = new Business.Acciones.AccCrearDeporte();
            resultado = crear.CrearDeporte(datosDeporte: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //3. Todo ha ido bien, redirigimos a la vista de gestion
            resultado = new Business.Acciones.ResultadoAccion();
            resultado.setResultado(Business.Acciones.TipoResultado.REDIRECCION);
            resultado.addMensaje(
                mensaje: Url.Action(actionName: "Gestion", controllerName: "Deporte"),
                tipoMensaje: Business.Acciones.TipoMensaje.REDIRECCION
            );

            return resultado.ResultadoToJson();
        }
        #endregion

        #region /Deporte/Eliminar

        /// <summary>
        /// GET: /Deporte/Eliminar
        /// </summary>
        /// <param name="id">identificador del deporte</param>
        /// <returns>String con el resultado JSON</returns>
        [HttpGet]
        public String Eliminar(Int32 id)
        {
            LAPI.Business.Acciones.ResultadoAccion resultado = null;

            //0. Comprobamos que haya sesión
            resultado = comprobarPermisoAdminSistema();
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //1. Eliminamos los datos
            LAPI.Business.Acciones.AccEliminarDeporte eliminar = new LAPI.Business.Acciones.AccEliminarDeporte();
            LAPI.Data.Model.Deporte model = new LAPI.Data.Model.Deporte();
            model.idDeporte = id;
            resultado = eliminar.EliminarDeporte(datosDeporte: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            return resultado.ResultadoToJson();
        }
           
        #endregion        

        #region Filtros Búsqueda

        /// <summary>
        /// POST: /Deporte/Buscar
        /// </summary>
        /// <param name="iddeporteFilter">Filtro por identificador</param>
        /// <param name="descripcionFilter">Filtro por descripcion</param>
        /// <returns>_ListadoDeporte.cshtml</returns>
        [HttpPost]
        public ActionResult Buscar(String iddeporteFilter, String descripcionFilter)
        {

            ActionResult resultado = comprobarErrorPermisoAdminSistema();
            if (resultado == null)
            {
                LAPI.Business.Gestores.GestorDeportes gestor = new Business.Gestores.GestorDeportes();

                //Creamos el filtro con los parametros posibles
                System.Collections.Hashtable filtro = new System.Collections.Hashtable();
                if (!String.IsNullOrEmpty(iddeporteFilter))
                    filtro.Add("iddeporte", iddeporteFilter);
                if (!String.IsNullOrEmpty(descripcionFilter))
                    filtro.Add("descripcion", descripcionFilter);

                return PartialView("_ListadoDeporte", gestor.ObtenerBusqueda(filtroBusqueda: filtro));
            }

            return resultado;            
        }

        #endregion

        /*################## SERVICIOS ##################*/

        #region /Deporte/getDeportes
        
        /// <summary>
        /// GET: /Deporte/getDeportes
        /// </summary>
        /// <returns>String con el json de la respuesta</returns>
        [HttpGet]
        public String getDeportes()
        {
            LAPI.Business.Acciones.AccGetDeportes getter = new Business.Acciones.AccGetDeportes();

            var items = getter.GetDeportes();

            return LAPI.Data.Model.Deporte.toJson(items);
        }
        
        #endregion

        #region /Deporte/getDeportesCentro

        /// <summary>
        /// GET: /Deporte/getDeportesCentro
        /// </summary>
        /// <param name="idCentroDeportivo">identificador único del centro deportivo</param>
        /// <returns>String con el json de la respuesta</returns>
        [HttpGet]
        public String getDeportesCentro(Int32 idCentroDeportivo)
        {
            LAPI.Business.Acciones.AccGetDeportes getter = new Business.Acciones.AccGetDeportes();

            var items = getter.GetDeportes(IdCentroDeportivo: idCentroDeportivo);

            return LAPI.Data.Model.Deporte.toJson(items);
        }

        #endregion
    }
}
